﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TransportHierarchyWithForms
{
    public partial class Form1 : Form
    {
        private TransportFactory factory;
        private Transport transport;
        private Accountant accountant;
        private LoggerFactory log_factory;
        public Form1()
        {
            InitializeComponent();
            DomainUpDown.DomainUpDownItemCollection trans_types = this.domainUpDown1.Items;
            DomainUpDown.DomainUpDownItemCollection surface_types = this.domainUpDown2.Items;
            DomainUpDown.DomainUpDownItemCollection avia_types = this.domainUpDown2.Items;
            this.textBox1.ScrollBars = ScrollBars.Vertical;
            //trans_types.Add("Наземный транспорт");
            //trans_types.Add("Авиа транспорт");
            
        }

        static TransportFactory GetTransportFactoryByType(uint trans_type)
        {
            TransportFactory newFactory = null;

            switch (trans_type)
            {
                case (uint)TransportType.SURFACE:
                    {
                        newFactory = new SurfaceFactory();
                        break;
                    }
                case (uint)TransportType.AVIA:
                    {
                        newFactory = new AviaFactory();
                        break;
                    }
                default: throw new ArgumentException("Invalid type.", "type");
            }
            return newFactory;
        }

        private void domainUpDown1_SelectedItemChanged(object sender, EventArgs e)
        {
            if (domainUpDown1.Text == "Наземный транспорт")
            {
                domainUpDown2.Items.Remove("Самолет");
                domainUpDown2.Items.Remove("Вертолет");
                domainUpDown2.Items.Add("Поезд");
                domainUpDown2.Items.Add("Автобус");
                domainUpDown2.Text = "Поезд";
                textBox1.Text += "Выбран тип транспорта: " + "Наземный транспорт" + "\r\n";
                textBox1.Refresh();
                domainUpDown2.Refresh();
            }
            else if (domainUpDown1.Text == "Авиа транспорт")
            {
                domainUpDown2.Items.Remove("Поезд");
                domainUpDown2.Items.Remove("Автобус");
                domainUpDown2.Items.Add("Самолет");
                domainUpDown2.Items.Add("Вертолет");
                domainUpDown2.Text = "Самолет";
                textBox1.Text += "Выбран тип транспорта: " + "Авиа транспорт" + "\r\n";
                textBox1.Refresh();
                domainUpDown2.Refresh();
            }
            
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            uint trans_type=0;
            uint der_type = 0;
            uint num_of_routes = Decimal.ToUInt32(numericUpDown1.Value);
            accountant = new Accountant();
            string[] routes_cost;
            string line = "";
            bool isNumeric=false;
            double n;
            uint i=0;
            if (domainUpDown1.Text=="Наземный транспорт"){
                trans_type=1;
            }
            else if (domainUpDown1.Text=="Авиа транспорт"){
                trans_type=2;
            }
            else {
                MessageBox.Show("Ошибка, неправильный тип транспорта");
                return;
            }
            factory = GetTransportFactoryByType(trans_type);
            if (domainUpDown2.Text == "Поезд" || domainUpDown2.Text == "Самолет")
            {
                der_type = 1;
                
            }
            else if (domainUpDown2.Text == "Автобус"||domainUpDown2.Text == "Вертолет")
            {
                der_type = 2;
            }
            else
            {
                MessageBox.Show("Ошибка, неправильный тип транспорта");
                return;
            }
            line = textBox3.Text.Trim();
            routes_cost = line.Split(',');
            transport = factory.CreateTransport(der_type);
            transport.NumberOfRouts = num_of_routes;
            transport.routes = new Route[transport.NumberOfRouts];
            for (int j = 0; j < transport.NumberOfRouts; j++)
            {
                transport.routes[j] = new Route();
            }
                
            if (routes_cost.Length > 0)
            {
                foreach (string number in routes_cost)
                {
                    if (i >= transport.NumberOfRouts)
                    {
                        MessageBox.Show("Количество путей больше чем стоимостей");
                        return;
                    }
                    isNumeric = double.TryParse(number, out n);
                    if (isNumeric)
                    {
                        transport.routes[i].Cost = n;
                    }
                    else
                    {
                        MessageBox.Show("Ошибка в записи чисел");
                        return;
                    }
                    i++;
                }
            }
            if (i != transport.NumberOfRouts)
            {
                MessageBox.Show("Недостаточное количество стоимостей");
                return;
            }
            i = 0;
            
            accountant.SumCost(transport);
            textBox2.Text = accountant.Sum.ToString();
        }

        private void domainUpDown2_SelectedItemChanged(object sender, EventArgs e)
        {
            textBox1.Text += "Выбран тип транспорта: " + domainUpDown2.Text + "\r\n";
        }

        

        

        
    }
}
